home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 020 / arcsourc.arc / ARCEXT.MAC < prev    next >
Encoding:
Text File  |  1985-10-10  |  5.0 KB  |  137 lines

  1. $define(arc,$ifdef(xarc,off,on))#      macro switch for ARC only code
  2. $define(xarc,$ifdef(xarc,on,off))#     macro switch for XARC only code
  3. $emit($arc)#
  4. /*  ARC - Archive utility - ARCEXT
  5.  
  6. $define(tag,$$segment(@1,$$index(@1,=)+1))#
  7. $define(version,Version $tag(
  8. TED_VERSION DB =2.12), created on $tag(
  9. TED_DATE DB =10/10/85) at $tag(
  10. TED_TIME DB =21:04:31))#
  11. $undefine(tag)#
  12.     $version
  13.  
  14. (C) COPYRIGHT 1985 by System Enhancement Associates; ALL RIGHTS RESERVED
  15.  
  16.     By:  Thom Henderson
  17.  
  18.     Description:
  19.          This file contains the routines used to extract files from
  20.          an archive.
  21.  
  22.     Language:
  23.          Computer Innovations Optimizing C86
  24. */
  25. #include <stdio.h>
  26. #include "arc.h"
  27.  
  28. extarc(num,arg,prt)                    /* extract files from archive */
  29. int num;                               /* number of arguments */
  30. char *arg[];                           /* pointers to arguments */
  31. int prt;                               /* true if printing */
  32. $emit($xarc)#
  33. extarc()                               /* extract files from archive */
  34. $emit(on)#
  35. {
  36.     struct heads hdr;                  /* file header */
  37. $emit($arc)#
  38.     int save;                          /* true to save current file */
  39.     int did[$maxarg];                  /* true when argument was used */
  40.     int n;                             /* index */
  41.  
  42.     for(n=0; n<num; n++)               /* for each argument */
  43.          did[n] = 0;                   /* reset usage flag */
  44. $emit(on)#
  45.  
  46.     openarc(0);                        /* open archive for reading */
  47.  
  48. $emit($arc)#
  49.     if(num)                            /* if files were named */
  50.     {    while(readhdr(&hdr,arc))      /* while more files to check */
  51.          {    save = 0;                /* reset save flag */
  52.               for(n=0; n<num; n++)     /* for each template given */
  53.               {    if(match(hdr.name,arg[n]))
  54.                    {    save = 1;      /* turn on save flag */
  55.                         did[n] = 1;    /* turn on usage flag */
  56.                         break;         /* stop looking */
  57.                    }
  58.               }
  59.  
  60.               if(save)                 /* if this file is wanted */
  61.                    extfile(&hdr,prt);  /* then extract it */
  62.               else fseek(arc,hdr.size,1);
  63.          }
  64.     }
  65.  
  66.     else while(readhdr(&hdr,arc))      /* else extract all files */
  67.          extfile(&hdr,prt);
  68. $emit($xarc)#
  69.     while(readhdr(&hdr,arc))           /* extract all files */
  70.          extfile(&hdr);
  71. $emit(on)#
  72.  
  73.     closearc(0);                       /* close archive after reading */
  74. $emit($arc)#
  75.  
  76.     if(note)
  77.          for(n=0; n<num; n++)          /* report unused args */
  78.               if(!did[n])
  79.                    printf("File not found: %s\n",arg[n]);
  80. $emit(on)#
  81. }
  82.  
  83. $emit($arc)#
  84. static extfile(hdr,prt)                /* extract a file */
  85. struct heads *hdr;                     /* pointer to header data */
  86. int prt;                               /* true if printing */
  87. $emit($xarc)#
  88. static extfile(hdr)                    /* extract a file */
  89. $emit(on)#
  90. {
  91.     FILE *f, *fopen();                 /* extracted file, opener */
  92.     char buf[$strlen];                 /* input buffer */
  93.  
  94. $emit($arc)#
  95.     if(prt)                            /* printing is much easier */
  96.     {    printf("\nFile: %s\n",hdr->name);
  97.          unpack(arc,stdout,hdr);       /* unpack file from archive */
  98.          return;                       /* see? I told you! */
  99.     }
  100.  
  101. $emit(on)#
  102.     if(note)
  103.          printf("Extracting file: %s\n",hdr->name);
  104.  
  105.     if(warn)
  106.     {    if(f=fopen(hdr->name,"rb"))   /* see if it exists */
  107.          {    fclose(f);
  108.               printf("WARNING: File %s already exists!",hdr->name);
  109.               while(1)
  110.               {    printf("  Overwrite it (y/n)? ");
  111.                    fgets(buf,$strlen,stdin);
  112.                    *buf = toupper(*buf);
  113.                    if(*buf=='Y' || *buf=='N')
  114.                         break;
  115.               }
  116.               if(*buf=='N')
  117.               {    printf("%s not extracted.\n",hdr->name);
  118.                    fseek(arc,hdr->size,1);
  119.                    return;
  120.               }
  121.          }
  122.     }
  123.  
  124.     if(!(f=fopen(hdr->name,"wb")))
  125.     {    if(warn)
  126.               printf("Cannot create %s\n",hdr->name);
  127.          fseek(arc,hdr->size,1);
  128.          return;
  129.     }
  130.  
  131.     /* now unpack the file */
  132.  
  133.     unpack(arc,f,hdr);                 /* unpack file from archive */
  134.     setstamp(f,hdr->date,hdr->time);   /* set the proper date/time stamp */
  135.     fclose(f);                         /* all done writing to file */
  136. }
  137.